/*
 * Copyright (C) 2025 Tsingteng MicroSystem
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */
/**
 * @file nfa_ce.h
 * @brief CE管理模块API定义
 */

#ifndef _NFA_CE_H_
#define _NFA_CE_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

#include "nci_feature.h"
#if IS_FEATURE_ON(NCI_FEATURE_CE)
#include "nfa_base.h"
#include "nfa_utils.h"

typedef uint8_t tNCI_CE_TECH;
#define NCI_CE_T3T 0x04
#define NCI_CE_T4T 0x01
#define NCI_CE_NONE 0xFF

/**
 * @brief CE通知外部的事件通知
 */
typedef enum {
    NCI_CE_EVT_FIELD_INFO = 0x00,
    NCI_CE_EVT_ACTIVATED,
    NCI_CE_EVT_DEACTIVATE,
    NCI_CE_EVT_DATA,

    NCI_CE_EVT_MAX
} tNCI_CE_EVT;

/**
 * @brief 数据结构体
 */
typedef struct {
    /** @brief 数据长度 */
    uint16_t len;
    /** @brief 数据指针 */
    const uint8_t *buf;
} tNCI_CE_BUF;

/**
 * @brief 外部接收数据及其类型的结构体
 */
typedef struct {
    /** @brief CE事件类型 */
    int type;
    /** @brief 上报的数据 */
    tNCI_CE_BUF data;
} tNCI_CE_RCV;

#if IS_FEATURE_ON(NCI_FEATURE_CE_DH)
/**
 * @brief T3T监听参数结构体
 */
typedef struct {
    /** @brief NFCID2参数指针 */
    uint8_t *nfcid2;
    /** @brief PMM参数指针 */
    uint8_t *pmm;
} tNCI_CE_LISTEN_T3T;

/**
 * @brief CE监听ID的结构体
 */
typedef struct {
    /** @brief 监听技术类型 */
    tNCI_CE_TECH tech;
    /** @brief 监听ID，根据技术类型不同而不同 */
    union {
        /** @brief T3T 系统代码 */
        uint16_t system_code;
    };
} tNCI_CE_LISTEN_ID;

/**
 * @brief CE监听参数结构体
 */
typedef union {
    /** @brief T3T监听参数 */
    tNCI_CE_LISTEN_T3T t3t;
} tNCI_CE_LISTEN_PARAM;
#endif // IS_FEATURE_ON(NCI_FEATURE_CE_DH)

/**
 * @brief CE通知外部事件所携带的信息和数据
 */
typedef union {
    /** @brief CE事件的tech类型 */
    int technology;
    /** @brief field信息 */
    bool field_on;
    /** @brief 接收CE上报的数据 */
    tNCI_CE_RCV rcv;
} tNCI_CE_INFO;

/**
 * @brief 外部注册给CE的回调，用于接收CE模块发送的通知
 */
typedef void (*tNCI_CE_CBACK)(tNCI_CE_EVT event, tNCI_CE_INFO *p_info);
#if IS_FEATURE_ON(NCI_FEATURE_CE_DH)
/**
 * @brief 外部发送数据给到CE处理的函数
 *
 * @param p_data 指向要传输的数据的指针.
 * @param len 要传输的数据长度.
 *
 * @return 传输成功返回NCI_STATUS_OK，失败返回错误码
 */
tNCI_STATUS nfa_ce_transmit(uint8_t *p_data, uint16_t len);
/**
 * @brief 获取NFCC支持的最大T3T标识符索引
 *
 * @param[out] max  返回支持的最大T3T标识符索引
 *
 * @return 成功返回NCI_STATUS_OK，失败返回错误码
 */
tNCI_STATUS nfa_ce_get_lf_t3t_max(int *max);
/**
 * @brief 注册监听
 *
 * @param[in] id 监听ID
 * @param[in] param 监听参数
 *
 * @return 成功返回NCI_STATUS_OK，失败返回错误码
 */
tNCI_STATUS nfa_ce_register_listen(tNCI_CE_LISTEN_ID *id, tNCI_CE_LISTEN_PARAM *param);
/**
 * @brief 注销监听
 *
 * @param[in] id 监听ID
 *
 * @return 成功返回NCI_STATUS_OK，失败返回错误码
 */
tNCI_STATUS nfa_ce_unregister_listen(tNCI_CE_LISTEN_ID *id);
#endif // IS_FEATURE_ON(NCI_FEATURE_CE_DH)
#endif // IS_FEATURE_ON(NCI_FEATURE_CE)
#ifdef __cplusplus
}
#endif /* __cplusplus */

#endif // _NFA_CE_H_